Isotope Dendrochronology
COURSE: DISC, LTRR, UNIVERSITY OF ARIZONA. INSTRUCTORS: P. SZEJNER & S. BELMECHERI

Instructions:

The following code and comments should further your experience of using a mechanistic model to understand the isotopic fractionation mechanisms underlying Oxygen isotope (d18O) in tree ring cellulose. This exercise will focus on the main determinants (variables and parameters) of cellulose d18O including: (1) source water isotope ratio, (2) leaf water isotopic enrichment, and (3) biochemical fractionation at the site of sucrose production and cellulose synthesis.

The exercise and the mechanistic model correspond to the process based models termed “Craig-Gordon” model [1], and the “Roden” model [2].

[1] Craig H, Gordon L (1965) Deuterium and oxygen 18 variations in the ocean and the marine atmosphere. In: Tongiorgi E (ed) Stable Isotopes in Oceanographic Studies and Paleotemperatures. Consiglio Nazionale delle ricerche Laboratorio di Geologia Nucleare. Pisa, Spoleto, Italy, pp 9–130).

[2] Roden J, Lin G, Ehleringer JR (2000) A mechanistic model for interpretation of hydrogen and oxygen isotope ratios in tree-ring cellulose. Geochim Cosmochim Acta 64:21–35. https://doi.org/10.1016/S0016-7037(99)00195-7

The stable Oxygen isotope composition of cellulose (δ18Ocell) is determined by three factors/processes:
1. The isotopic content of the source water.
2. The leaf evaporative enrichment effect.
3. The proportion of phloem sugars that exchange with source water during cellulose formation.

The signal of these three processes is integrated into the cambium during xylogenesis. The goal of this exercise is to: (1) implement a mechanistic model to account for all these factors processes and their associated fractionations, (2) to use this mechanistic model to interpret variations of cellulose d18O.

You will simulate three different isotopic ratios in tree ring cellulose for different environmental conditions. These environmental condition reflect the growing season variability of relative humidity and precipitation experienced by trees growing in the US Southwest (See Figure 1). The growing season in this region is characterized by a bimodal distribution of precipitation (Winter-snowpack and Summer-Monsoon). The relative humidity varies from dry spring to humid summer. The two periods are separated by a hyper arid period where with low precipitation and extremely low relative humidity. Accordingly, the variables in the model will vary as follows:
* The relative humidity from 50% (spring) to 30% (pre-summer drought) to 60% (monsoon).
* The mean air temperature will vary from 25, to 33, to 27 Celsius.
* The source water will remain constant at -8 permill.

At the end of the exercise, you will compare the simulated 18O cellulose for the 3 seasonal variations of RH (and temperature) with measurements of cellulose d18O in tree rings from a site located in the US Southwest.

Figure 1: Seasonal relative humidity in HEL-Catalina Mountains (Arizona) (Belmecheri et al. 2018 PCE). Notice the large variations of relative humidity.

Instructions

You will need to download the R project from https://github.com/paulszejner/DISCO-Notebook2.git and set your own working directory. Once you open the Notebook2.Rproj in R studio you can open the Notebook2.Rmd file to proceed with this exercise.

PART 1: Source Water

The d18O of source water noted as Source_18O is the isotopic ratio of the water transported through the xylem up to the leaves. This is derived from direct precipitation, soil water or Thus, it is the starting point of d18O that will be modified by the isotopic effects (fractionations) during all the steps leading to its fixation in tree ring cellulose. Having a robust estimation or measurement of source water d18O is therefore paramount.

Here, the source water is set up at a fixed value:

Source_18O <- -8 # This is the isotopic value of the source water and  will remain constant at -8 permill during this  exercise

Then, it is converted to an isotopic ratio with regard to the standard VSMOW:

rsmow <- 0.0020052 # Oxygen Isotope ratio from STANDARD VSMOW
Rsource= rsmow*(1+Source_18O/1000) 

Next, the isotopic value of the water vapor is estimated based on source water d18O and leaf temperature, assuming equilibrium between atmospheric vapor and source water. Water vapor can be estimates as follows:

water_vapor = Source water + the equilibrium fractionation between liquid water and vapor.

The equilibrium fractionation varies as a function of temperature.

# water_vapor = Source water + the equilibrium fractionation.

# The 3 temperature values need to be modified to reflect the seasonality described in the introduction
temperature <- c(40, 40, 40) # temperature here is in Celsius 

#**** WARNING**** for water vapor temperature is in Kelvin (273.15)
water_vapor <-Source_18O +(-1*(1.137*(1000000/((temperature+273.15)^2))-0.4156*((1000/(temperature+273.15))-2.0667))) 

Then, it is converted to an isotopic ratio with regard to the standard VSMOW:

Rwater_vapor= rsmow*(1+water_vapor/1000)
#note!  I need help on figuring out this! What is needed?

PART 2: leaf water isotopic enrichment

During plant transpiration, the heavier H218O evaporates and diffuses more slowly through the stomata than does H216O, leaving leaf water enriched in 18O. At steady state and considering the leaf as a single and isotopically well-mixed water pool, the leaf water isotopic enrichment can be estimated using the Craig Gordon model.

#Constants

# br = boundary layer conductance. (mol m-2 s-1)
br <-1 #considered reasonable value between 0.02 to 3 in Roden paper boundary layer resistance    
ak <- 1.0285    # alpha_kappa, Kinetic Fractionation 
akb <- 1.0189   # alpha_kappa_beta, Kinetic Fractionation boundary layer


# Variables  remember to modify these values to the variability form the Figure 1

###########
Relative_humidity <- c(100, 100, 100)
###########

Stomatal_conductance <- 0.5

We already know that the source water has this values:

round (Rsource, digits = 4)

We already know that the water vapor could be close to has this values:

round(Rwater_vapor, digits = 4)
# a*  **equilibrium fractionation at leaf temperature  
# The equilibrium fractionation factor, a* is temperature dependent 
# (see Majoube, 1971, J. Chim. Phys. 58:1423-1436)
alpha_star =exp((1.137*1000/(273.15+temperature)^2)-(0.4156/(273.15+temperature))-0.0020667)
#R source O  isotope ratio, source water


# barometric    pressure  (mmbar)  
press_bar <- 77 #a good site average is 77.5 according to W, This need to be changed for the pressure level

Here we assume that the vapor is saturated inside the leaf. We apply this formula to calculate the vapor pressure when saturated (Rh=100%) at the temperature we best estimate the plant is and call it "ei".


ei <- (101325*exp((((-0.1299*(1-(373.16/(273.15 + temperature)))-0.6445)*(1-(373.16/(273.15 + temperature)))-1.976)*(1-(373.16/(273.15 + temperature)))+13.3185)*(1-(373.16/(273.15 + temperature)))))/1000

#wi,  leaf water vapor, converted to mole fraction
wi=ei/press_bar

#ea ambient vapor pressure (kPa)
ea_v <- (Relative_humidity/100)*ei

#wa, ambient water vapor, mole fraction
wa_v= ea_v/press_bar

# VPD in (kPa)
vpd =ei-ea_v 
round(vpd, digits=4 )

Here we can see the differences in Vapour presure defficity along these three times during the growing season.

#Total Conductance in mol
g = 1/(1/Stomatal_conductance + 1/br) # or 1/(rs+rb)

# E leaf transpiration (mol m-2 s-1) # barbour 2004
E_v_gs <- (wi-wa_v)*g

#ws, leaf surface water vapor, mole frac Roden 2000, Ball (1987),
ws_v_gs <- ((Stomatal_conductance*wi)-E_v_gs*(1-wi/2))/(Stomatal_conductance - E_v_gs/2)

# es vapor pressure at leaf surface (kPa) higher pressure  than the atmosphere
esl_v_gs <- ws_v_gs*press_bar

round(esl_v_gs, digits = 2)
round(ea_v, digits=2)

Lets recall some values that we already have estimated that will be important to keep track and estimate the expectation on the leaf water enrichment:

Rsource Source water
Rwater_vapor isotopic value of the water vapor
ei Water vapor presure saturated inside the leaf
ea_v Water vapor pressure atmosphere
esl_v_gs Water vapor pressure at leaf surface

And some constants like alpha_kappa, Kinetic Fractionation and alpha_kappa_beta, Kinetic Fractionation boundary layer

ak <- 1.0285    # alpha_kappa, Kinetic Fractionation 
akb <- 1.0189   # alpha_kappa_beta, Kinetic Fractionation boundary layer

# here we estimate the Leaf water enrichment:
Rleaf_v <- alpha_star*((ak*Rsource *
                              ((ei-esl_v_gs)/ei))+
                             (akb*Rsource *(esl_v_gs-ea_v)/ei)+
                             (Rwater_vapor*ea_v/ei))

# Rleaf_v now the leaf water is estimated in terms of R  and we must convert this value  on permill in rsmow Oxygen Isotope ratio from STANDARD SMOV
# Recall
rsmow <- 0.0020052
# we started on a value  of -10 permil now after  the evaporative enrichment  the leaf water has moverd  from -10 to 5 permil
leaf_water_18O <- ((Rleaf_v/rsmow)-1)*1000
round(leaf_water_18O, digits = 2)

PART 3: isotopic signal in the Cellulose

Isotopic fractionation during sugar synthesis and mixing during cellulose synthesis.

Now, after we know the water where the sugars are made and transported in the phloem, we can use the leaf water and the Source_18O to estimate the result on the cellulose, take into consideration that during cellulose synthesis, the source water will have some influence on the result, and we usually use a 42 percent exchange.

# Now   after we know the  water where the sugars are made and trasported in the floem  we can use the leaf water and the Source_18O to estimate the end result on the cellulose, take in consideration that during  cellulose sinthesisi  the source water will have some influence on the end result. and we usualy use a 42 percent exchange
# and some constants

epsilon_s <-  27 #Autotrophic fractionation Sucrose 
epsilon_c <- 27 # Autotrophic fractionation Cellulose ## 0.0084*Tmin.ts^2-0.51*Tmin.ts+ 33.172 
F_0 <- 0.42 # proportion of source water used during cellulose sinthesys

cellulose_d18O= F_0*(Source_18O + epsilon_c) + (1 - F_0) * (leaf_water_18O+ epsilon_s) 

PART 4: Comparison between modeled data and observations

Mechanistic modeling of tree‐ring cellulose δ18O and leaf water enrichment ΔL, and their sensitivities to relative humidity. (a) The Craig–Gordon model (CG) outputs are plotted from May to December, the period corresponding to cell wall thickening for all tree‐ring subdivisions. The yellow color lines correspond to the CG simulations of δ18O cellulose within the range of the proportion of exchangeable oxygen in cellulose (Pex) variability from 0.1 (thin line) to 0.7 (thick line). The gray horizontal bars correspond to the cell wall thickening (or cell‐maturation) period for each subdivision and are plotted on the mean of the δ18O measurements. The cell wall thickening phase was derived from microscopic phenological observations from Morino and Hughes (University of Arizona, unpublished observations, Table S3). The climate drivers used in the CG model to make δ18Ocel predictions were derived from PRISM data; (b) seasonal cycle of the CG mean leaf water enrichment (ΔL). The shaded gray color corresponds to the standard deviation of modelled ΔL. The dashed blue line in (a) and (b) indicates the average date of the monsoon onset; (c) modelled ΔL plotted versus relative humidity (RH) in % calculated at bimonthly resolution. The ΔL simulations were run using mean, minimum, and maximum RH. The range of RH for the hyper‐arid period of May and June are plotted in orange circles. The dark blue circles represent RH range observed for the monsoon season (July–August). The gray circles correspond to the range of RH observed from September to April (Belmecheri et al. 2018 PCE)

your estimations for the callulose oxygen Isotopes are:

round(cellulose_d18O, digits = 2)

your estimations for the leaf water oxygen Isotopes are:

round(leaf_water_18O, digits = 2)

Comparison between modeled data and observations,

Now with these values that you comared write down your observations differences and similarities between the modeled data in this excersise and the measurements shown in the figure 2 above.

How do you think this tool is useful?

What are the constrains or difficulties on implementing this model for reliable analysis?

LS0tCnRpdGxlOiAiTWVjaGFuaXN0aWMgbW9kZWwgb2YgdGhlIE94eWdlbiBpc290b3BlIGluIHRyZWUgcmluZyBjZWxsdWxvc2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIyMjIyMgIElzb3RvcGUgRGVuZHJvY2hyb25vbG9neQojIyMjIyAgQ09VUlNFOiBESVNDLCBMVFJSLCBVTklWRVJTSVRZIE9GIEFSSVpPTkEuIElOU1RSVUNUT1JTOiBQLiBTWkVKTkVSICYgUy4gQkVMTUVDSEVSSQoKIyMjIEluc3RydWN0aW9uczoKClRoZSBmb2xsb3dpbmcgY29kZSBhbmQgY29tbWVudHMgc2hvdWxkIGZ1cnRoZXIgeW91ciBleHBlcmllbmNlIG9mIHVzaW5nIGEgbWVjaGFuaXN0aWMgbW9kZWwgdG8gdW5kZXJzdGFuZCB0aGUgaXNvdG9waWMgZnJhY3Rpb25hdGlvbiBtZWNoYW5pc21zIHVuZGVybHlpbmcgT3h5Z2VuIGlzb3RvcGUgKGQxOE8pIGluIHRyZWUgcmluZyBjZWxsdWxvc2UuIFRoaXMgZXhlcmNpc2Ugd2lsbCBmb2N1cyBvbiB0aGUgbWFpbiBkZXRlcm1pbmFudHMgKHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycykgb2YgY2VsbHVsb3NlIGQxOE8gaW5jbHVkaW5nOiAoMSkgc291cmNlIHdhdGVyIGlzb3RvcGUgcmF0aW8sICgyKSBsZWFmIHdhdGVyIGlzb3RvcGljIGVucmljaG1lbnQsIGFuZCAoMykgYmlvY2hlbWljYWwgZnJhY3Rpb25hdGlvbiBhdCB0aGUgc2l0ZSBvZiBzdWNyb3NlIHByb2R1Y3Rpb24gYW5kIGNlbGx1bG9zZSBzeW50aGVzaXMuCgpUaGUgZXhlcmNpc2UgYW5kIHRoZSBtZWNoYW5pc3RpYyBtb2RlbCBjb3JyZXNwb25kIHRvIHRoZSBwcm9jZXNzIGJhc2VkIG1vZGVscyB0ZXJtZWQgIkNyYWlnLUdvcmRvbiIgbW9kZWwgWzFdLCBhbmQgdGhlICJSb2RlbiIgbW9kZWwgWzJdLgoKClsxXSBDcmFpZyBILCBHb3Jkb24gTCAoMTk2NSkgRGV1dGVyaXVtIGFuZCBveHlnZW4gMTggdmFyaWF0aW9ucyBpbiB0aGUgb2NlYW4gYW5kIHRoZSBtYXJpbmUgYXRtb3NwaGVyZS4gSW46IFRvbmdpb3JnaSBFIChlZCkgU3RhYmxlIElzb3RvcGVzIGluIE9jZWFub2dyYXBoaWMgU3R1ZGllcyBhbmQgUGFsZW90ZW1wZXJhdHVyZXMuIENvbnNpZ2xpbyBOYXppb25hbGUgZGVsbGUgcmljZXJjaGUgTGFib3JhdG9yaW8gZGkgR2VvbG9naWEgTnVjbGVhcmUuIFBpc2EsIFNwb2xldG8sIEl0YWx5LCBwcCA54oCTMTMwKS4KCgpbMl0gUm9kZW4gSiwgTGluIEcsIEVobGVyaW5nZXIgSlIgKDIwMDApIEEgbWVjaGFuaXN0aWMgbW9kZWwgZm9yIGludGVycHJldGF0aW9uIG9mIGh5ZHJvZ2VuIGFuZCBveHlnZW4gaXNvdG9wZSByYXRpb3MgaW4gdHJlZS1yaW5nIGNlbGx1bG9zZS4gR2VvY2hpbSBDb3Ntb2NoaW0gQWN0YSA2NDoyMeKAkzM1LiBodHRwczovL2RvaS5vcmcvMTAuMTAxNi9TMDAxNi03MDM3KDk5KTAwMTk1LTcKCgpUaGUgc3RhYmxlIE94eWdlbiBpc290b3BlIGNvbXBvc2l0aW9uIG9mIGNlbGx1bG9zZSAozrQxOE9jZWxsKSBpcyBkZXRlcm1pbmVkIGJ5IHRocmVlIGZhY3RvcnMvcHJvY2Vzc2VzOiAgCjEuIFRoZSBpc290b3BpYyBjb250ZW50IG9mIHRoZSBzb3VyY2Ugd2F0ZXIuICAKMi4gVGhlIGxlYWYgZXZhcG9yYXRpdmUgZW5yaWNobWVudCBlZmZlY3QuICAgCjMuIFRoZSBwcm9wb3J0aW9uIG9mIHBobG9lbSBzdWdhcnMgdGhhdCBleGNoYW5nZSB3aXRoIHNvdXJjZSB3YXRlciBkdXJpbmcgY2VsbHVsb3NlIGZvcm1hdGlvbi4gICAKClRoZSBzaWduYWwgb2YgdGhlc2UgdGhyZWUgcHJvY2Vzc2VzIGlzIGludGVncmF0ZWQgaW50byB0aGUgY2FtYml1bSBkdXJpbmcgeHlsb2dlbmVzaXMuIFRoZSBnb2FsIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG86ICgxKSBpbXBsZW1lbnQgYSBtZWNoYW5pc3RpYyBtb2RlbCB0byBhY2NvdW50IGZvciBhbGwgdGhlc2UgZmFjdG9ycyBwcm9jZXNzZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZnJhY3Rpb25hdGlvbnMsICgyKSB0byB1c2UgdGhpcyBtZWNoYW5pc3RpYyBtb2RlbCB0byBpbnRlcnByZXQgdmFyaWF0aW9ucyBvZiBjZWxsdWxvc2UgZDE4Ty4gCgpZb3Ugd2lsbCBzaW11bGF0ZSB0aHJlZSBkaWZmZXJlbnQgaXNvdG9waWMgcmF0aW9zIGluIHRyZWUgcmluZyBjZWxsdWxvc2UgZm9yIGRpZmZlcmVudCBlbnZpcm9ubWVudGFsIGNvbmRpdGlvbnMuIFRoZXNlIGVudmlyb25tZW50YWwgY29uZGl0aW9uIHJlZmxlY3QgdGhlIGdyb3dpbmcgc2Vhc29uIHZhcmlhYmlsaXR5IG9mIHJlbGF0aXZlIGh1bWlkaXR5IGFuZCBwcmVjaXBpdGF0aW9uIGV4cGVyaWVuY2VkIGJ5IHRyZWVzIGdyb3dpbmcgaW4gdGhlIFVTIFNvdXRod2VzdCAoU2VlIEZpZ3VyZSAxKS4gVGhlIGdyb3dpbmcgc2Vhc29uIGluIHRoaXMgcmVnaW9uIGlzIGNoYXJhY3Rlcml6ZWQgYnkgYSBiaW1vZGFsIGRpc3RyaWJ1dGlvbiBvZiBwcmVjaXBpdGF0aW9uIChXaW50ZXItc25vd3BhY2sgYW5kIFN1bW1lci1Nb25zb29uKS4gVGhlIHJlbGF0aXZlIGh1bWlkaXR5IHZhcmllcyBmcm9tIGRyeSBzcHJpbmcgdG8gaHVtaWQgc3VtbWVyLiBUaGUgdHdvIHBlcmlvZHMgYXJlIHNlcGFyYXRlZCBieSBhIGh5cGVyIGFyaWQgcGVyaW9kIHdoZXJlIHdpdGggbG93IHByZWNpcGl0YXRpb24gYW5kIGV4dHJlbWVseSBsb3cgcmVsYXRpdmUgaHVtaWRpdHkuIEFjY29yZGluZ2x5LCB0aGUgdmFyaWFibGVzIGluIHRoZSBtb2RlbCB3aWxsIHZhcnkgYXMgZm9sbG93czogICAgCiogVGhlIHJlbGF0aXZlIGh1bWlkaXR5IGZyb20gNTAlIChzcHJpbmcpIHRvIDMwJSAocHJlLXN1bW1lciBkcm91Z2h0KSB0byA2MCUgKG1vbnNvb24pLiAgCiogVGhlIG1lYW4gYWlyIHRlbXBlcmF0dXJlIHdpbGwgdmFyeSBmcm9tIDI1LCB0byAzMywgdG8gMjcgQ2Vsc2l1cy4gIAoqIFRoZSBzb3VyY2Ugd2F0ZXIgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbC4gICAgIAoKQXQgdGhlIGVuZCBvZiB0aGUgZXhlcmNpc2UsIHlvdSB3aWxsIGNvbXBhcmUgdGhlIHNpbXVsYXRlZCAxOE8gY2VsbHVsb3NlIGZvciB0aGUgMyBzZWFzb25hbCB2YXJpYXRpb25zIG9mIFJIIChhbmQgdGVtcGVyYXR1cmUpIHdpdGggbWVhc3VyZW1lbnRzIG9mIGNlbGx1bG9zZSBkMThPIGluIHRyZWUgcmluZ3MgZnJvbSBhIHNpdGUgbG9jYXRlZCBpbiB0aGUgVVMgU291dGh3ZXN0LgoKIVtGaWd1cmUgMTogU2Vhc29uYWwgcmVsYXRpdmUgaHVtaWRpdHkgaW4gSEVMLUNhdGFsaW5hIE1vdW50YWlucyAoQXJpem9uYSkgKEJlbG1lY2hlcmkgZXQgYWwuIDIwMTggUENFKS4gTm90aWNlIHRoZSBsYXJnZSB2YXJpYXRpb25zIG9mIHJlbGF0aXZlIGh1bWlkaXR5Ll0oZmlndXJlcy9GSUdVUkUxX1JILnBuZykKCiMjIyMjIEluc3RydWN0aW9ucyAgIApZb3Ugd2lsbCBuZWVkIHRvIGRvd25sb2FkIHRoZSBSIHByb2plY3QgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcGF1bHN6ZWpuZXIvRElTQ08tTm90ZWJvb2syLmdpdCBhbmQgc2V0IHlvdXIgb3duIHdvcmtpbmcgZGlyZWN0b3J5LiBPbmNlIHlvdSBvcGVuIHRoZSBgYGBOb3RlYm9vazIuUnByb2pgYGAgaW4gUiBzdHVkaW8geW91IGNhbiBvcGVuIHRoZSBgYGBOb3RlYm9vazIuUm1kYGBgIGZpbGUgdG8gcHJvY2VlZCB3aXRoIHRoaXMgZXhlcmNpc2UuCgojIyBQQVJUIDE6IFNvdXJjZSBXYXRlcgoKVGhlIGQxOE8gb2Ygc291cmNlIHdhdGVyIG5vdGVkICBhcyBgYGBTb3VyY2VfMThPYGBgIGlzIHRoZSBpc290b3BpYyByYXRpbyBvZiB0aGUgd2F0ZXIgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aGUgeHlsZW0gdXAgdG8gdGhlIGxlYXZlcy4gVGhpcyBpcyBkZXJpdmVkIGZyb20gZGlyZWN0IHByZWNpcGl0YXRpb24sIHNvaWwgd2F0ZXIgb3IgClRodXMsIGl0IGlzIHRoZSBzdGFydGluZyBwb2ludCBvZiBkMThPIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgaXNvdG9waWMgZWZmZWN0cyAoZnJhY3Rpb25hdGlvbnMpIGR1cmluZyBhbGwgdGhlIHN0ZXBzIGxlYWRpbmcgdG8gaXRzIGZpeGF0aW9uIGluIHRyZWUgcmluZyBjZWxsdWxvc2UuIEhhdmluZyBhIHJvYnVzdCBlc3RpbWF0aW9uIG9yIG1lYXN1cmVtZW50IG9mIHNvdXJjZSB3YXRlciBkMThPIGlzIHRoZXJlZm9yZSBwYXJhbW91bnQuICAgIAoKSGVyZSwgdGhlIHNvdXJjZSB3YXRlciBpcyBzZXQgdXAgYXQgYSBmaXhlZCB2YWx1ZToKYGBge3J9ClNvdXJjZV8xOE8gPC0gLTggIyBUaGlzIGlzIHRoZSBpc290b3BpYyB2YWx1ZSBvZiB0aGUgc291cmNlIHdhdGVyIGFuZCAgd2lsbCByZW1haW4gY29uc3RhbnQgYXQgLTggcGVybWlsbCBkdXJpbmcgdGhpcyAgZXhlcmNpc2UKYGBgClRoZW4sIGl0IGlzIGNvbnZlcnRlZCB0byBhbiBpc290b3BpYyByYXRpbyB3aXRoIHJlZ2FyZCB0byB0aGUgc3RhbmRhcmQgVlNNT1c6ICAKYGBge3J9CnJzbW93IDwtIDAuMDAyMDA1MiAjIE94eWdlbiBJc290b3BlIHJhdGlvIG9mIHRoZSBTVEFOREFSRAlWU01PVwpSc291cmNlPSByc21vdyooMStTb3VyY2VfMThPLzEwMDApIApgYGAKCk5leHQsIHRoZSAgaXNvdG9waWMgdmFsdWUgb2YgdGhlIHdhdGVyIHZhcG9yIGlzIGVzdGltYXRlZCBiYXNlZCBvbiBzb3VyY2Ugd2F0ZXIgZDE4TyBhbmQgbGVhZiB0ZW1wZXJhdHVyZSwgYXNzdW1pbmcgZXF1aWxpYnJpdW0gYmV0d2VlbiBhdG1vc3BoZXJpYyB2YXBvciBhbmQgc291cmNlIHdhdGVyLiAgV2F0ZXIgdmFwb3IgY2FuIGJlIGVzdGltYXRlcyBhcyBmb2xsb3dzOiAgCgp3YXRlcl92YXBvciA9IFNvdXJjZSB3YXRlciArIHRoZSBlcXVpbGlicml1bSBmcmFjdGlvbmF0aW9uIGJldHdlZW4gbGlxdWlkIHdhdGVyIGFuZCB2YXBvci4gIAoKVGhlIGVxdWlsaWJyaXVtIGZyYWN0aW9uYXRpb24gdmFyaWVzIGFzIGEgZnVuY3Rpb24gb2YgdGVtcGVyYXR1cmUuICAKCmBgYHtyfQojIFRoZSAzIHRlbXBlcmF0dXJlIHZhbHVlcyBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIHJlZmxlY3QgdGhlIHNlYXNvbmFsaXR5IGRlc2NyaWJlZCBpbiB0aGUgaW50cm9kdWN0aW9uCnRlbXBlcmF0dXJlIDwtIGMoNDAsIDQwLCA0MCkgIyB0ZW1wZXJhdHVyZSBoZXJlIGlzIGluIENlbHNpdXMgCgojIHRoZSB0ZW1wZXJhdHVyZSBpbiB0aGUgZXF1YXRpb24gYmVsb3cgcmVmZXJzIHRvIHRoZSBsZWFmIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgQ2Vsc2l1cyBhbmQgaXMgY252ZXJ0ZWQgdG8gS2VsdmluICgyNzMuMTUpCndhdGVyX3ZhcG9yIDwtU291cmNlXzE4TyArKC0xKigxLjEzNyooMTAwMDAwMC8oKHRlbXBlcmF0dXJlKzI3My4xNSleMikpLTAuNDE1NiooKDEwMDAvKHRlbXBlcmF0dXJlKzI3My4xNSkpLTIuMDY2NykpKSAKYGBgCgpUaGVuLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYW4gaXNvdG9waWMgcmF0aW8gd2l0aCByZWdhcmQgdG8gdGhlIHN0YW5kYXJkIFZTTU9XOiAgCmBgYHtyfQpSd2F0ZXJfdmFwb3I9IHJzbW93KigxK3dhdGVyX3ZhcG9yLzEwMDApCiNub3RlISAgSSBuZWVkIGhlbHAgb24gZmlndXJpbmcgb3V0IHRoaXMhIFdoYXQgaXMgbmVlZGVkPwpgYGAKCiMjIFBBUlQgMjogbGVhZiB3YXRlciBpc290b3BpYyBlbnJpY2htZW50ICAKCkR1cmluZyBwbGFudCB0cmFuc3BpcmF0aW9uLCB0aGUgaGVhdmllciBIMjE4TyBldmFwb3JhdGVzIGFuZCBkaWZmdXNlcyBtb3JlIHNsb3dseSB0aHJvdWdoIHRoZSBzdG9tYXRhIHRoYW4gZG9lcyBIMjE2TywgbGVhdmluZyBsZWFmIHdhdGVyIGVucmljaGVkIGluIDE4Ty4gQXQgc3RlYWR5IHN0YXRlIGFuZCBjb25zaWRlcmluZyB0aGUgbGVhZiBhcyBhIHNpbmdsZSBhbmQgaXNvdG9waWNhbGx5IHdlbGwtbWl4ZWQgd2F0ZXIgcG9vbCwgdGhlIGxlYWYgd2F0ZXIgaXNvdG9waWMgZW5yaWNobWVudCBjYW4gYmUgZXN0aW1hdGVkIHVzaW5nIHRoZSBDcmFpZyBHb3Jkb24gbW9kZWwuCgpgYGB7cn0KI0NvbnN0YW50cwoKIyBiciA9IGJvdW5kYXJ5IGxheWVyIGNvbmR1Y3RhbmNlLiAobW9sIG0tMiBzLTEpCmJyIDwtMSAjY29uc2lkZXJlZCByZWFzb25hYmxlIHZhbHVlIGJldHdlZW4gMC4wMiB0byAzIGluIFJvZGVuIHBhcGVyIGJvdW5kYXJ5IGxheWVyIHJlc2lzdGFuY2UgICAgCmFrIDwtIDEuMDI4NQkjIGFscGhhX2thcHBhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gCmFrYiA8LSAxLjAxODkJIyBhbHBoYV9rYXBwYV9iZXRhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gYm91bmRhcnkgbGF5ZXIKCgojIFZhcmlhYmxlcyAgcmVtZW1iZXIgdG8gbW9kaWZ5IHRoZXNlIHZhbHVlcyB0byB0aGUgdmFyaWFiaWxpdHkgZm9ybSB0aGUgRmlndXJlIDEKCiMjIyMjIyMjIyMjClJlbGF0aXZlX2h1bWlkaXR5IDwtIGMoMTAwLCAxMDAsIDEwMCkKIyMjIyMjIyMjIyMKClN0b21hdGFsX2NvbmR1Y3RhbmNlIDwtIDAuNQpgYGAKCldlIGFscmVhZHkga25vdyB0aGF0IHRoZSBzb3VyY2Ugd2F0ZXIgaGFzIHRoaXMgdmFsdWVzOgpgYGAge3J9CnJvdW5kIChSc291cmNlLCBkaWdpdHMgPSA0KQpgYGAKCldlIGFscmVhZHkga25vdyB0aGF0IHRoZSB3YXRlciB2YXBvciBjb3VsZCBiZSBjbG9zZSB0byBoYXMgdGhpcyB2YWx1ZXM6CmBgYCB7cn0Kcm91bmQoUndhdGVyX3ZhcG9yLCBkaWdpdHMgPSA0KQpgYGAgCgpgYGB7cn0KIyBhKiAgKiplcXVpbGlicml1bSBmcmFjdGlvbmF0aW9uIGF0IGxlYWYgdGVtcGVyYXR1cmUgIAojIFRoZSBlcXVpbGlicml1bSBmcmFjdGlvbmF0aW9uIGZhY3RvciwgYSogaXMgdGVtcGVyYXR1cmUgZGVwZW5kZW50IAojIChzZWUgTWFqb3ViZSwgMTk3MSwgSi4gQ2hpbS4gUGh5cy4gNTg6MTQyMy0xNDM2KQphbHBoYV9zdGFyID1leHAoKDEuMTM3KjEwMDAvKDI3My4xNSt0ZW1wZXJhdHVyZSleMiktKDAuNDE1Ni8oMjczLjE1K3RlbXBlcmF0dXJlKSktMC4wMDIwNjY3KQojUiBzb3VyY2UgTyAgaXNvdG9wZSByYXRpbywgc291cmNlIHdhdGVyCgoKIyBiYXJvbWV0cmljCXByZXNzdXJlICAobW1iYXIpICAKcHJlc3NfYmFyIDwtIDc3ICNhIGdvb2Qgc2l0ZSBhdmVyYWdlIGlzIDc3LjUgYWNjb3JkaW5nIHRvIFcsIFRoaXMgbmVlZCB0byBiZSBjaGFuZ2VkIGZvciB0aGUgcHJlc3N1cmUgbGV2ZWwKYGBgCgpIZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSB2YXBvciBpcyBzYXR1cmF0ZWQgaW5zaWRlIHRoZSBsZWFmLiBXZSBhcHBseSB0aGlzIGZvcm11bGEgdG8gY2FsY3VsYXRlIHRoZSB2YXBvciBwcmVzc3VyZSB3aGVuIHNhdHVyYXRlZCAoUmg9MTAwJSkgYXQgdGhlIHRlbXBlcmF0dXJlIHdlIGJlc3QgZXN0aW1hdGUgdGhlIHBsYW50IGlzIGFuZCBjYWxsIGl0IGBgYCJlaSJgYGAuCgpgYGB7cn0KCmVpIDwtICgxMDEzMjUqZXhwKCgoKC0wLjEyOTkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSktMC42NDQ1KSooMS0oMzczLjE2LygyNzMuMTUgKyB0ZW1wZXJhdHVyZSkpKS0xLjk3NikqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSkrMTMuMzE4NSkqKDEtKDM3My4xNi8oMjczLjE1ICsgdGVtcGVyYXR1cmUpKSkpKS8xMDAwCgojd2ksICBsZWFmIHdhdGVyIHZhcG9yLCBjb252ZXJ0ZWQgdG8gbW9sZSBmcmFjdGlvbgp3aT1laS9wcmVzc19iYXIKCiNlYSBhbWJpZW50IHZhcG9yIHByZXNzdXJlIChrUGEpCmVhX3YgPC0gKFJlbGF0aXZlX2h1bWlkaXR5LzEwMCkqZWkKCiN3YSwgYW1iaWVudCB3YXRlciB2YXBvciwgbW9sZSBmcmFjdGlvbgp3YV92PSBlYV92L3ByZXNzX2JhcgoKIyBWUEQgaW4gKGtQYSkKdnBkID1laS1lYV92IApyb3VuZCh2cGQsIGRpZ2l0cz00ICkKYGBgCkhlcmUgd2UgY2FuIHNlZSB0aGUgZGlmZmVyZW5jZXMgaW4gVmFwb3VyIHByZXN1cmUgZGVmZmljaXR5IGFsb25nIHRoZXNlIHRocmVlIHRpbWVzIGR1cmluZyB0aGUgZ3Jvd2luZyBzZWFzb24uCmBgYCB7cn0KI1RvdGFsIENvbmR1Y3RhbmNlIGluIG1vbApnID0gMS8oMS9TdG9tYXRhbF9jb25kdWN0YW5jZSArIDEvYnIpICMgb3IgMS8ocnMrcmIpCgojIEUgbGVhZiB0cmFuc3BpcmF0aW9uIChtb2wgbS0yIHMtMSkgIyBiYXJib3VyIDIwMDQKRV92X2dzIDwtICh3aS13YV92KSpnCgojd3MsIGxlYWYgc3VyZmFjZSB3YXRlciB2YXBvciwgbW9sZSBmcmFjIFJvZGVuIDIwMDAsIEJhbGwgKDE5ODcpLAp3c192X2dzIDwtICgoU3RvbWF0YWxfY29uZHVjdGFuY2Uqd2kpLUVfdl9ncyooMS13aS8yKSkvKFN0b21hdGFsX2NvbmR1Y3RhbmNlIC0gRV92X2dzLzIpCgojIGVzIHZhcG9yIHByZXNzdXJlIGF0IGxlYWYgc3VyZmFjZSAoa1BhKSBoaWdoZXIgcHJlc3N1cmUgIHRoYW4gdGhlIGF0bW9zcGhlcmUKZXNsX3ZfZ3MgPC0gd3Nfdl9ncypwcmVzc19iYXIKCnJvdW5kKGVzbF92X2dzLCBkaWdpdHMgPSAyKQpyb3VuZChlYV92LCBkaWdpdHM9MikKCmBgYAoKTGV0cyByZWNhbGwgc29tZSAgdmFsdWVzICB0aGF0IHdlIGFscmVhZHkgaGF2ZSBlc3RpbWF0ZWQgdGhhdCB3aWxsIGJlICBpbXBvcnRhbnQgdG8ga2VlcCB0cmFjayBhbmQgZXN0aW1hdGUgdGhlIGV4cGVjdGF0aW9uIG9uIHRoZSBsZWFmIHdhdGVyIGVucmljaG1lbnQ6CgpgYGAgUnNvdXJjZSBgYGAgIFNvdXJjZSB3YXRlciAgCmBgYFJ3YXRlcl92YXBvcmBgYCBpc290b3BpYyB2YWx1ZSBvZiB0aGUgd2F0ZXIgdmFwb3IgICAgIApgYGBlaWBgYCBXYXRlciB2YXBvciBwcmVzdXJlIHNhdHVyYXRlZCBpbnNpZGUgdGhlIGxlYWYgICAgCmBgYGVhX3ZgYGAgIFdhdGVyIHZhcG9yIHByZXNzdXJlIGF0bW9zcGhlcmUgIApgYGBlc2xfdl9nc2BgYCBXYXRlciB2YXBvciBwcmVzc3VyZSBhdCBsZWFmIHN1cmZhY2UgIAoKQW5kIHNvbWUgY29uc3RhbnRzICBsaWtlIGFscGhhX2thcHBhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gIGFuZCBhbHBoYV9rYXBwYV9iZXRhLCBLaW5ldGljIEZyYWN0aW9uYXRpb24gYm91bmRhcnkgbGF5ZXIKYGBgIHtyfQphayA8LSAxLjAyODUJIyBhbHBoYV9rYXBwYSwgS2luZXRpYyBGcmFjdGlvbmF0aW9uIApha2IgPC0gMS4wMTg5CSMgYWxwaGFfa2FwcGFfYmV0YSwgS2luZXRpYyBGcmFjdGlvbmF0aW9uIGJvdW5kYXJ5IGxheWVyCgojIGhlcmUgd2UgZXN0aW1hdGUgdGhlIExlYWYgd2F0ZXIgZW5yaWNobWVudDoKUmxlYWZfdiA8LSBhbHBoYV9zdGFyKigoYWsqUnNvdXJjZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZWktZXNsX3ZfZ3MpL2VpKSkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFrYipSc291cmNlICooZXNsX3ZfZ3MtZWFfdikvZWkpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSd2F0ZXJfdmFwb3IqZWFfdi9laSkpCgojIFJsZWFmX3Ygbm93IHRoZSBsZWFmIHdhdGVyIGlzIGVzdGltYXRlZCBpbiB0ZXJtcyBvZiBSICBhbmQgd2UgbXVzdCBjb252ZXJ0IHRoaXMgdmFsdWUgIG9uIHBlcm1pbGwgaW4gcnNtb3cgT3h5Z2VuIElzb3RvcGUgcmF0aW8gZnJvbSBTVEFOREFSRAlTTU9WCiMgUmVjYWxsCnJzbW93IDwtIDAuMDAyMDA1MgojIHdlIHN0YXJ0ZWQgb24gYSB2YWx1ZSAgb2YgLTEwIHBlcm1pbCBub3cgYWZ0ZXIgIHRoZSBldmFwb3JhdGl2ZSBlbnJpY2htZW50ICB0aGUgbGVhZiB3YXRlciBoYXMgbW92ZXJkICBmcm9tIC0xMCB0byA1IHBlcm1pbApsZWFmX3dhdGVyXzE4TyA8LSAoKFJsZWFmX3YvcnNtb3cpLTEpKjEwMDAKcm91bmQobGVhZl93YXRlcl8xOE8sIGRpZ2l0cyA9IDIpCmBgYAoKIyMgUEFSVCAzOiBpc290b3BpYyBzaWduYWwgaW4gdGhlIENlbGx1bG9zZSAgCgpJc290b3BpYyBmcmFjdGlvbmF0aW9uIGR1cmluZyBzdWdhciBzeW50aGVzaXMgYW5kIG1peGluZyBkdXJpbmcgY2VsbHVsb3NlIHN5bnRoZXNpcy4gCgpOb3csIGFmdGVyIHdlIGtub3cgdGhlIHdhdGVyIHdoZXJlIHRoZSBzdWdhcnMgYXJlIG1hZGUgYW5kIHRyYW5zcG9ydGVkIGluIHRoZSBwaGxvZW0sIHdlIGNhbiB1c2UgdGhlIGxlYWYgd2F0ZXIgYW5kIHRoZSBTb3VyY2VfMThPIHRvIGVzdGltYXRlIHRoZSByZXN1bHQgb24gdGhlIGNlbGx1bG9zZSwgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gdGhhdCBkdXJpbmcgY2VsbHVsb3NlIHN5bnRoZXNpcywgdGhlIHNvdXJjZSB3YXRlciB3aWxsIGhhdmUgc29tZSBpbmZsdWVuY2Ugb24gdGhlIHJlc3VsdCwgYW5kIHdlIHVzdWFsbHkgdXNlIGEgNDIgcGVyY2VudCBleGNoYW5nZS4KCgpgYGB7cn0KIyBOb3cgICBhZnRlciB3ZSBrbm93IHRoZSAgd2F0ZXIgd2hlcmUgdGhlIHN1Z2FycyBhcmUgbWFkZSBhbmQgdHJhc3BvcnRlZCBpbiB0aGUgZmxvZW0gIHdlIGNhbiB1c2UgdGhlIGxlYWYgd2F0ZXIgYW5kIHRoZSBTb3VyY2VfMThPIHRvIGVzdGltYXRlIHRoZSBlbmQgcmVzdWx0IG9uIHRoZSBjZWxsdWxvc2UsIHRha2UgaW4gY29uc2lkZXJhdGlvbiB0aGF0IGR1cmluZyAgY2VsbHVsb3NlIHNpbnRoZXNpc2kgIHRoZSBzb3VyY2Ugd2F0ZXIgd2lsbCBoYXZlIHNvbWUgaW5mbHVlbmNlIG9uIHRoZSBlbmQgcmVzdWx0LiBhbmQgd2UgdXN1YWx5IHVzZSBhIDQyIHBlcmNlbnQgZXhjaGFuZ2UKIyBhbmQgc29tZSBjb25zdGFudHMKCmVwc2lsb25fcyA8LSAgMjcgI0F1dG90cm9waGljIGZyYWN0aW9uYXRpb24gU3Vjcm9zZQkKZXBzaWxvbl9jIDwtIDI3CSMgQXV0b3Ryb3BoaWMgZnJhY3Rpb25hdGlvbiBDZWxsdWxvc2UgIyMgMC4wMDg0KlRtaW4udHNeMi0wLjUxKlRtaW4udHMrIDMzLjE3MiAKRl8wIDwtIDAuNDIgIyBwcm9wb3J0aW9uIG9mIHNvdXJjZSB3YXRlciB1c2VkIGR1cmluZyBjZWxsdWxvc2Ugc2ludGhlc3lzCgpjZWxsdWxvc2VfZDE4Tz0gRl8wKihTb3VyY2VfMThPICsgZXBzaWxvbl9jKSArICgxIC0gRl8wKSAqIChsZWFmX3dhdGVyXzE4TysgZXBzaWxvbl9zKSAKCmBgYAoKIyMgUEFSVCA0OiBDb21wYXJpc29uIGJldHdlZW4gbW9kZWxlZCBkYXRhIGFuZCBvYnNlcnZhdGlvbnMKCiFbTWVjaGFuaXN0aWMgbW9kZWxpbmcgb2YgdHJlZeKAkHJpbmcgY2VsbHVsb3NlIM60MThPIGFuZCBsZWFmIHdhdGVyIGVucmljaG1lbnQgzpRMLCBhbmQgdGhlaXIgc2Vuc2l0aXZpdGllcyB0byByZWxhdGl2ZSBodW1pZGl0eS4gKGEpIFRoZSBDcmFpZ+KAk0dvcmRvbiBtb2RlbCAoQ0cpIG91dHB1dHMgYXJlIHBsb3R0ZWQgZnJvbSBNYXkgdG8gRGVjZW1iZXIsIHRoZSBwZXJpb2QgY29ycmVzcG9uZGluZyB0byBjZWxsIHdhbGwgdGhpY2tlbmluZyBmb3IgYWxsIHRyZWXigJByaW5nIHN1YmRpdmlzaW9ucy4gVGhlIHllbGxvdyBjb2xvciBsaW5lcyBjb3JyZXNwb25kIHRvIHRoZSBDRyBzaW11bGF0aW9ucyBvZiDOtDE4TyBjZWxsdWxvc2Ugd2l0aGluIHRoZSByYW5nZSBvZiB0aGUgcHJvcG9ydGlvbiBvZiBleGNoYW5nZWFibGUgb3h5Z2VuIGluIGNlbGx1bG9zZSAoUGV4KSB2YXJpYWJpbGl0eSBmcm9tIDAuMSAodGhpbiBsaW5lKSB0byAwLjcgKHRoaWNrIGxpbmUpLiBUaGUgZ3JheSBob3Jpem9udGFsIGJhcnMgY29ycmVzcG9uZCB0byB0aGUgY2VsbCB3YWxsIHRoaWNrZW5pbmcgKG9yIGNlbGzigJBtYXR1cmF0aW9uKSBwZXJpb2QgZm9yIGVhY2ggc3ViZGl2aXNpb24gYW5kIGFyZSBwbG90dGVkIG9uIHRoZSBtZWFuIG9mIHRoZSDOtDE4TyBtZWFzdXJlbWVudHMuIFRoZSBjZWxsIHdhbGwgdGhpY2tlbmluZyBwaGFzZSB3YXMgZGVyaXZlZCBmcm9tIG1pY3Jvc2NvcGljIHBoZW5vbG9naWNhbCBvYnNlcnZhdGlvbnMgZnJvbSBNb3Jpbm8gYW5kIEh1Z2hlcyAoVW5pdmVyc2l0eSBvZiBBcml6b25hLCB1bnB1Ymxpc2hlZCBvYnNlcnZhdGlvbnMsIFRhYmxlIFMzKS4gVGhlIGNsaW1hdGUgZHJpdmVycyB1c2VkIGluIHRoZSBDRyBtb2RlbCB0byBtYWtlIM60MThPY2VsIHByZWRpY3Rpb25zIHdlcmUgZGVyaXZlZCBmcm9tIFBSSVNNIGRhdGE7IChiKSBzZWFzb25hbCBjeWNsZSBvZiB0aGUgQ0cgbWVhbiBsZWFmIHdhdGVyIGVucmljaG1lbnQgKM6UTCkuIFRoZSBzaGFkZWQgZ3JheSBjb2xvciBjb3JyZXNwb25kcyB0byB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIG1vZGVsbGVkIM6UTC4gVGhlIGRhc2hlZCBibHVlIGxpbmUgaW4gKGEpIGFuZCAoYikgaW5kaWNhdGVzIHRoZSBhdmVyYWdlIGRhdGUgb2YgdGhlIG1vbnNvb24gb25zZXQ7IChjKSBtb2RlbGxlZCDOlEwgcGxvdHRlZCB2ZXJzdXMgcmVsYXRpdmUgaHVtaWRpdHkgKFJIKSBpbiAlIGNhbGN1bGF0ZWQgYXQgYmltb250aGx5IHJlc29sdXRpb24uIFRoZSDOlEwgc2ltdWxhdGlvbnMgd2VyZSBydW4gdXNpbmcgbWVhbiwgbWluaW11bSwgYW5kIG1heGltdW0gUkguIFRoZSByYW5nZSBvZiBSSCBmb3IgdGhlIGh5cGVy4oCQYXJpZCBwZXJpb2Qgb2YgTWF5IGFuZCBKdW5lIGFyZSBwbG90dGVkIGluIG9yYW5nZSBjaXJjbGVzLiBUaGUgZGFyayBibHVlIGNpcmNsZXMgcmVwcmVzZW50IFJIIHJhbmdlIG9ic2VydmVkIGZvciB0aGUgbW9uc29vbiBzZWFzb24gKEp1bHnigJNBdWd1c3QpLiBUaGUgZ3JheSBjaXJjbGVzIGNvcnJlc3BvbmQgdG8gdGhlIHJhbmdlIG9mIFJIIG9ic2VydmVkIGZyb20gU2VwdGVtYmVyIHRvIEFwcmlsIChCZWxtZWNoZXJpIGV0IGFsLiAyMDE4IFBDRSldKGZpZ3VyZXMvRklHVVJFNi5wbmcpCgp5b3VyIGVzdGltYXRpb25zIGZvciB0aGUgY2FsbHVsb3NlIG94eWdlbiBJc290b3BlcyBhcmU6CmBgYHtyfQpyb3VuZChjZWxsdWxvc2VfZDE4TywgZGlnaXRzID0gMikKYGBgCnlvdXIgZXN0aW1hdGlvbnMgZm9yIHRoZSBsZWFmIHdhdGVyIG94eWdlbiBJc290b3BlcyBhcmU6CmBgYHtyfQpyb3VuZChsZWFmX3dhdGVyXzE4TywgZGlnaXRzID0gMikKYGBgCgojIyMgIENvbXBhcmlzb24gYmV0d2VlbiBtb2RlbGVkIGRhdGEgYW5kIG9ic2VydmF0aW9ucywgCk5vdyB3aXRoIHRoZXNlIHZhbHVlcyB0aGF0IHlvdSBjb21hcmVkICB3cml0ZSBkb3duIHlvdXIgb2JzZXJ2YXRpb25zIGRpZmZlcmVuY2VzIGFuZCAgc2ltaWxhcml0aWVzIGJldHdlZW4gIHRoZSBtb2RlbGVkIGRhdGEgaW4gdGhpcyBleGNlcnNpc2UgYW5kIHRoZSBtZWFzdXJlbWVudHMgc2hvd24gaW4gdGhlIGZpZ3VyZSAyIGFib3ZlLiAgCgpIb3cgZG8geW91IHRoaW5rIHRoaXMgdG9vbCBpcyB1c2VmdWw/CgpXaGF0IGFyZSB0aGUgY29uc3RyYWlucyBvciBkaWZmaWN1bHRpZXMgb24gaW1wbGVtZW50aW5nIHRoaXMgbW9kZWwgZm9yIHJlbGlhYmxlIGFuYWx5c2lzPwoKCgoKCgoKCgoKCgoK